package com.stupid.method.util;

import android.util.Log;

public class XLog {
	public static final int LEVEL_VERBOSE = 0;
	public static final int LEVEL_DEBUG = 1;
	public static final int LEVEL_INFO = 2;
	public static final int LEVEL_WARNING = 3;
	public static final int LEVEL_ERROR = 4;
	public static final int LEVEL_FATAL = 5;

	private static int sLevel = LEVEL_VERBOSE;

	/**
	 * set log level, the level lower than this level will not be logged
	 * 
	 * @param level
	 */
	public static void setLogLevel(int level) {
		sLevel = level;
	}

	/**
	 * Send a VERBOSE log message.
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void v(String tag, String msg) {
		if (sLevel > LEVEL_VERBOSE) {
			return;
		}
		Log.v(tag, msg);
	}

	/**
	 * Send a VERBOSE log message.
	 * 
	 * @param tag
	 * @param msg
	 * @param throwable
	 */
	public static void v(String tag, String msg, Throwable throwable) {
		if (sLevel > LEVEL_VERBOSE) {
			return;
		}
		Log.v(tag, msg, throwable);
	}

	/**
	 * Send a VERBOSE log message.
	 * 
	 * @param tag
	 * @param msg
	 * @param args
	 */
	public static void v(String tag, String msg, Object... args) {
		if (sLevel > LEVEL_VERBOSE) {
			return;
		}
		if (args.length > 0) {
			msg = String.format(msg, args);
		}
		Log.v(tag, msg);
	}

	/**
	 * Send a DEBUG log message
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void d(String tag, String msg) {
		if (sLevel > LEVEL_DEBUG) {
			return;
		}
		Log.d(tag, msg);
	}

	/**
	 * Send a DEBUG log message
	 * 
	 * @param tag
	 * @param msg
	 * @param args
	 */
	public static void d(String tag, String msg, Object... args) {
		if (sLevel > LEVEL_DEBUG) {
			return;
		}
		if (args.length > 0) {
			msg = String.format(msg, args);
		}
		Log.d(tag, msg);
	}

	/**
	 * Send a DEBUG log message
	 * 
	 * @param tag
	 * @param msg
	 * @param throwable
	 */
	public static void d(String tag, String msg, Throwable throwable) {
		if (sLevel > LEVEL_DEBUG) {
			return;
		}
		Log.d(tag, msg, throwable);
	}

	/**
	 * Send an INFO log message
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void i(String tag, String msg) {
		if (sLevel > LEVEL_INFO) {
			return;
		}
		Log.i(tag, msg);
	}

	/**
	 * Send an INFO log message
	 * 
	 * @param tag
	 * @param msg
	 * @param args
	 */
	public static void i(String tag, String msg, Object... args) {
		if (sLevel > LEVEL_INFO) {
			return;
		}
		if (args.length > 0) {
			msg = String.format(msg, args);
		}
		Log.i(tag, msg);
	}

	/**
	 * Send an INFO log message
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void i(String tag, String msg, Throwable throwable) {
		if (sLevel > LEVEL_INFO) {
			return;
		}
		Log.i(tag, msg, throwable);
	}

	/**
	 * Send a WARNING log message
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void w(String tag, String msg) {
		if (sLevel > LEVEL_WARNING) {
			return;
		}
		Log.w(tag, msg);
	}

	/**
	 * Send a WARNING log message
	 * 
	 * @param tag
	 * @param msg
	 * @param args
	 */
	public static void w(String tag, String msg, Object... args) {
		if (sLevel > LEVEL_WARNING) {
			return;
		}
		if (args.length > 0) {
			msg = String.format(msg, args);
		}
		Log.w(tag, msg);
	}

	/**
	 * Send a WARNING log message
	 * 
	 * @param tag
	 * @param msg
	 * @param throwable
	 */
	public static void w(String tag, String msg, Throwable throwable) {
		if (sLevel > LEVEL_WARNING) {
			return;
		}
		Log.w(tag, msg, throwable);
	}

	/**
	 * Send an ERROR log message
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void e(String tag, String msg) {
		if (sLevel > LEVEL_ERROR) {
			return;
		}
		Log.e(tag, msg);
	}

	/**
	 * Send an ERROR log message
	 * 
	 * @param tag
	 * @param msg
	 * @param args
	 */
	public static void e(String tag, String msg, Object... args) {
		if (sLevel > LEVEL_ERROR) {
			return;
		}
		if (args.length > 0) {
			msg = String.format(msg, args);
		}
		Log.e(tag, msg);
	}

	/**
	 * Send an ERROR log message
	 * 
	 * @param tag
	 * @param msg
	 * @param throwable
	 */
	public static void e(String tag, String msg, Throwable throwable) {
		if (sLevel > LEVEL_ERROR) {
			return;
		}
		Log.e(tag, msg, throwable);
	}

	/**
	 * Send a FATAL ERROR log message
	 * 
	 * @param tag
	 * @param msg
	 */
	public static void f(String tag, String msg) {
		if (sLevel > LEVEL_FATAL) {
			return;
		}
		Log.wtf(tag, msg);
	}

	/**
	 * Send a FATAL ERROR log message
	 * 
	 * @param tag
	 * @param msg
	 * @param args
	 */
	public static void f(String tag, String msg, Object... args) {
		if (sLevel > LEVEL_FATAL) {
			return;
		}
		if (args.length > 0) {
			msg = String.format(msg, args);
		}
		Log.wtf(tag, msg);
	}

	/**
	 * Send a FATAL ERROR log message
	 * 
	 * @param tag
	 * @param msg
	 * @param throwable
	 */
	public static void f(String tag, String msg, Throwable throwable) {
		if (sLevel > LEVEL_FATAL) {
			return;
		}
		Log.wtf(tag, msg, throwable);
	}
}
